package com.ftg.learn.chapter09.base01;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 细聊反射
 *
 * 1 ： 场景
 * 1.1 在不对类进行实例化的前提下，完成对类的信息 ， 方法  、实例的处理
 * 1.2 把一个抽象化的概念转换成为一个具体的事物的过程
 *
 * ORM : object relational mapping [A object Mapping(*.xml) B object]
 * 强   -前【结婚证】-  容
 *
 *
 * @author 布衣
 */
public class LearnReflech {

    public static void main(String[] args) {

        //三种一种  (1 class.forname 2 类名.class 3 类的实例.getClass())

        // 地址  描述    价格
        String str = "com.ftg.learn.chapter09.Flies";

        Class<Flies> fliesClass = Flies.class;

        Class<? extends Flies> aClass = new Flies().getClass();

        //反射
        try {
            //cls 叫做 Flies的关联对象
            Class cls = Class.forName(str);
            Field f1 = cls.getField("age");
            //实例化  newInstance()
            // o 才是 str对应的真实类的实例
            Constructor constructor = cls.getConstructor();
            Object o1 = constructor.newInstance();
            Object o = cls.newInstance();
            //field 字段
            f1.set(o,12);
            System.out.println(f1.get(o));

            Field name = cls.getDeclaredField("name");
            //Accessible 访问权限 的问题
            name.setAccessible(true);
            name.set(o,"小苍蝇");
            System.out.println(name.get(o));

            Method m1 = cls.getMethod("fly");

            Object invoke = m1.invoke(o);
            System.out.println(invoke);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }

    }

}
